package org.usmile.algorithms.huawei.acm;

import java.util.Arrays;
import java.util.Scanner;

// https://blog.csdn.net/qfc_128220/article/details/128566880
public class _农场施肥 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int m = sc.nextInt();
        int n = sc.nextInt();

        int[] fields = new int[m];
        for (int i = 0; i < m; i++) {
            fields[i] = sc.nextInt();
        }

        System.out.println(getResult(n, fields));
    }

    public static int getResult(int n, int[] fields) {
        double min = 1; // 最小果林面积
        double max = Arrays.stream(fields).max().orElse(0); // 最大果林面积

        int ans = -1;
        // 我们需要找min,max中间值作为k效率，如果min,max间距小于1，则没有中间值，循环结束
        while (min <= max) {
            int k = (int) Math.ceil((min + max) / 2);
            int res = check(k, n, fields);

            if (res > 0) {
                min = k + 1; // k的效率太低，导致花费的时间超过了n天，因此要提高k效率
            } else {
                ans = k; // k的效率太高或刚好，花费的时间<=n天，则此时k效率就是一个题解，但可能不是最优解
                max = k - 1; // 继续尝试找更小的k
            }
        }

        return ans;
    }

    public static int check(int k, int n, int[] fields) {
        int spend = 0;
        for (int field : fields) {
            if (k >= field) {
                spend++; // k效率比field果林面积大，则field果林只需要一天
            } else {
                spend += Math.ceil(field / (double) k); // k效率比field果林面积小，则需要Math.ceil(field / k)天
            }
        }

        return spend - n;
    }
}
